import 'package:flutter/material.dart';

class AppAnimatedOverlay extends StatefulWidget {
  final Widget content; // 动态内容
  final VoidCallback onClose; // 动画结束后关闭 Overlay 的回调
  final Duration duration; // 动画持续时间
  final Offset beginOffset; // 动画起始位置
  final Offset endOffset; // 动画结束位置
  final bool dismissOnBackgroundTap; // 是否允许点击蒙层关闭
  final bool showOverlay; // 是否显示蒙层
  final String? position; // 位置：'top'、'bottom' 或 null（居中）
  final Offset? customPosition; // 自定义坐标（优先级高于 'top' 和 'bottom'）

  const AppAnimatedOverlay({
    required this.content,
    required this.onClose,
    this.duration = const Duration(milliseconds: 300),
    this.beginOffset = const Offset(1.0, 0.0), // 从右侧屏幕外开始
    this.endOffset = Offset.zero, // 到屏幕内
    this.dismissOnBackgroundTap = true, // 默认允许点击蒙层关闭
    this.showOverlay = true, // 默认显示蒙层
    this.position, // 位置：'top'、'bottom' 或 null
    this.customPosition, // 自定义坐标
    Key? key,
  }) : super(key: key);

  /// 提供一个静态方法供外部触发关闭
  static late _AppAnimatedOverlayState? _overlayState;

  static void close() {
    _overlayState?._closeOverlay(); // 调用内部的关闭逻辑
  }

  @override
  _AppAnimatedOverlayState createState() {
    _overlayState = _AppAnimatedOverlayState(); // 保存 state 的引用
    return _overlayState!;
  }
}

class _AppAnimatedOverlayState extends State<AppAnimatedOverlay>
    with SingleTickerProviderStateMixin {
  late AnimationController _controller;
  late Animation<Offset> _offsetAnimation;

  @override
  void initState() {
    super.initState();
    _controller = AnimationController(
      vsync: this,
      duration: widget.duration,
    );

    _offsetAnimation = Tween<Offset>(
      begin: widget.beginOffset,
      end: widget.endOffset,
    ).animate(CurvedAnimation(
      parent: _controller,
      curve: Curves.easeInOut,
    ));

    // 开始播放进入动画
    _controller.forward();
  }

  /// 内部方法：播放反向动画并关闭 Overlay
  void _closeOverlay() {
    _controller.reverse().then((_) {
      // 动画结束后触发 onClose 回调
      widget.onClose();
    });
  }

  @override
  void dispose() {
    _controller.dispose();
    AppAnimatedOverlay._overlayState = null; // 清除静态引用
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    // 根据位置动态渲染内容
    Widget contentWidget;

    if (widget.customPosition != null) {
      // 自定义坐标
      contentWidget = Positioned(
        left: widget.customPosition!.dx,
        top: widget.customPosition!.dy,
        child: SlideTransition(
          position: _offsetAnimation,
          child: Material(
            color: Colors.transparent,
            child: widget.content, // 动态内容
          ),
        ),
      );
    } else if (widget.position == 'top') {
      // 顶部
      contentWidget = Align(
        alignment: Alignment.topCenter, // 底部居中对齐
        child: Padding(
          padding: EdgeInsets.only(top: 50.0), // 设置底部偏移量
          child: SlideTransition(
            position: _offsetAnimation,
            child: Material(
              color: Colors.transparent,
              child: widget.content, // 动态内容
            ),
          ),
        ),
      );
    } else if (widget.position == 'bottom') {
      // 底部
      contentWidget = Align(
        alignment: Alignment.bottomCenter, // 底部居中对齐
        child: Padding(
          padding: EdgeInsets.only(bottom: 50.0), // 设置底部偏移量
          child: SlideTransition(
            position: _offsetAnimation,
            child: Material(
              color: Colors.transparent,
              child: widget.content, // 动态内容
            ),
          ),
        ),
      );
    } else {
      // 居中（默认）
      contentWidget = Center(
        child: SlideTransition(
          position: _offsetAnimation,
          child: Material(
            color: Colors.transparent,
            child: widget.content, // 动态内容
          ),
        ),
      );
    }

    return Stack(
      children: [
        // 蒙层
        if (widget.showOverlay)
          GestureDetector(
            behavior: HitTestBehavior.translucent, // 捕获点击
            onTap: widget.dismissOnBackgroundTap ? _closeOverlay : null, // 配置是否允许点击关闭
            child: Container(
              width: double.infinity,
              height: double.infinity,
              color: Colors.black.withOpacity(0.3), // 蒙层颜色
            ),
          ),
        // 动画内容
        contentWidget,
      ],
    );
  }
}
